package com.gitee.l0km.aocache.config;

import static com.google.common.base.Preconditions.checkNotNull;

import java.lang.reflect.Member;
import java.lang.reflect.Modifier;
import java.util.Map;

public class CacheConfigSuppliers {
    
    private static Object determineTarget(Member member, Object target) {
        return Modifier.isStatic(member.getModifiers()) ? target : null;
    }

    /**
     * 创建一个 CacheConfigSupplier 实例，用于根据给定的成员、目标对象和配置信息提供缓存配置。
     * <p>
     * 此方法接收一个成员对象、目标对象和一个配置对象，并返回一个实现了 CacheConfigSupplier 接口的实例。
     * 该实例的 configOf 方法将根据输入的成员和目标对象来确定是否返回相应的缓存配置。
     * </p>
     * 
     * @param member 用于确定缓存配置的成员对象，不能为 null。
     * @param target 目标对象，可能用于确定缓存配置的上下文,如果为 null，不参与匹配。
     * @param jpConfig 缓存配置对象，用于生成 CacheConfig 实例。如果 不是非空 Map返回 null。
     * @return 返回一个实现了 CacheConfigSupplier 接口的实例，用于提供缓存配置。
     * @throws NullPointerException 如果 member 参数为 null，则抛出此异常。
     */
    @SuppressWarnings("unchecked")
	public static CacheConfigSupplier of(final Member member, final Object target, final Object jpConfig) {
    	if(jpConfig instanceof Map && !((Map<String,Object>)jpConfig).isEmpty()) {
    		checkNotNull(member, "member must not be null");
    		return new CacheConfigSupplier() {
    			final Object _target = determineTarget(member, target);
    			
    			@Override
    			public CacheConfig configOf(Member input, Object tgt) {
    				if (input != null) {
    					tgt = determineTarget(input, tgt);
    					/** target为null，则不参与匹配 */
    					if (member.equals(input) && (null == _target ||  _target == tgt)) {
    						return CacheConfig.of(jpConfig);
    					}
    				}
    				return null;
    			}
    		};
    	}
    	return null;
	}
}
